<?php
class Application_Model_Objects extends Xend_Db_Model {
	protected $_dbTableName = 'Application_Model_Table_Actions';

	public function __construct() {
		parent::__construct();
	}

	/**
	 * sucht nach einem Objekt, das uebergebenen Bedingungen entsprecht
	 * @param array $where Array mit Bedingungen, die an die Datenbank uebergeben werden
	 * @param array $ref Array mit Tabellen, die verknuepft werden sollen
	 * @return array Array mit den Daten, die aus der Datenbank geladen wurden
	 */
	public function find($where, $ref = array(), Application_Model_Schema_Object $object = null) {
		if(is_array($data = $this->findall($where, $ref, array('limit' => 1)))) {
			$object = current($data);
		}

		return $object;
	}

	/**
	 * sucht nach allen Objekten, den uebergebenen Bedingungen entsprechen
	 * @param array $where Array mit Bedingungen, die an die Datenbank uebergeben werden
	 * @param array $ref Array mit Tabellen, die verknuepft werden sollen
	 * @param array $options Optionen, die bei der Abfrage verarbeitet werden:
	 *	+ limit: maximale Anzahl der Ergebnisse, die geliefert werden sollen
	 * @return array Array mit den Daten, die aus der Datenbank geladen wurden
	 */
	public function findall($where = array(), $ref = array(), $options = array()) {
		$objects	= array();
		$ref			= array_flip($ref);
		$select		= $this->_database
			->select()
			->from(
				array('objects'),
        array('objects.id', 'objects.name', 'object_types_id')
			)
			->order(array('objects.id'));

		// Referenzen
		// -----------------------------------------------------------------------------------
		if(array_key_exists('ObjectTypes', $ref)) {
			$select
				->joinLeft('object_types', 'objects.object_types_id = object_types.id', null)
				->columns(array('id', 'name'), 'object_types');
		}

		// Where
		// -----------------------------------------------------------------------------------
		if(is_array($where) && !empty($where)) {
			foreach($where as $k => $v) {
				$select->where($k, $v);
			}
		}

		// Options
		// -----------------------------------------------------------------------------------
		if(isset($options['limit'])) {
			$select->limit($options['limit'], 0);
		}

		// Datenauswertung
		// -----------------------------------------------------------------------------------
		foreach($this->fetch($select) as $k => $v) {

			$objectType	= new Application_Model_Schema_ObjectType();
			$objectType
				->setId($v['objects']['object_types_id']);

			if(array_key_exists('ObjectTypes', $ref)) {
				$objectType
					->setName($v['object_types']['name']);
			}

			$object	= new Application_Model_Schema_Object();
			$object
				->setId($v['objects']['id'])
				->setName($v['objects']['name'])
				->setType($objectType);

			$objects[(int) $v['objects']['id']] = $object;
		}
		
		// Actions
		// -----------------------------------------------------------------------------------
		if(array_key_exists('Actions', $ref)) {
			$objects = $this->_assignActionReferences($objects);
		}		

		return $objects;
	}
	
	/**
	 * verknuepft die, per Array uebergebenen, Objekte mit den Daten der
	 * referenzierten Actions (action_use_objects)
	 * @param array $sources Array mit den Daten der Objekte
	 * @param array $references optionales Array mit den UID der Objekte
	 * @return array Array der Objekte mit den verknuepften Actions-Eintraegen
	 */
	protected function _assignActionReferences($sources, $references = array()) {
		if(empty($references)) {
			foreach($sources as $source) {
				$references[$source->id] = $source->id;
			}
		}

		$select = $this->_database
			->select()
			->from(
				array('actions'),
        array('actions.id', 'actions.name', 'action_use_objects.objects_id')
			)
			->join('action_use_objects', 'actions.id = action_use_objects.actions_id', null)
			->where('action_use_objects.objects_id IN (?)', $references);

		// Datenauswertung
		// -----------------------------------------------------------------------------------
		foreach($this->fetch($select) as $k => $v) {
			$objectId = (int) $v['action_use_objects']['objects_id'];

			if(array_key_exists($objectId, $references)) {
				$action = new Application_Model_Schema_Action();
				$action
					->setId($v['actions']['id'])
					->setName($v['actions']['name']);

				$sources[$references[$objectId]]->setAction($action, $action->id);
			}
		}

		return $sources;
	}	
}
?>